

package educar.models;

import educar.db.JPA;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;



/**
 *
 * @author Marcela Bessone 
 */

public class Materia {
    
    private static JPA jpa = new JPA();  //Atributo utilizado para cear una instancia de una consulta.
 
    private String codmateria;  //String utilizado para almacenar el código de la materia.
    
    private String nombre;  //String utilizado para almacenar el nombre de la materia.
    
    private String dni;  //String utilizado para almacenar el dni del docente responsable.
    
 
    /**
     * Constructor de la clase Materia
     * @param codmateria
     * @param nombre
     * @param dni 
     */
    public Materia (String codmateria, String nombre, String dni) {
	   this.setCodmateria(codmateria);
	   this.setNombre(nombre);
	   this.setDni(dni);
    }//Fin del método Materia(String, String, String)
    
    
    /**
     * Constructor sin parametros de la clase Materia
     * @param materia 
     */
    public Materia(String[] materia) {
        this.setCodmateria(materia[0]);
        this.setNombre(materia[1]);
        this.setDni(materia[2]);
    }//Fin del método Materia(String[])
        
    /**
     * <hr>
     * existe(): Sirve para poder verificar si existe o no una materia
     * <hr>
     * @param codigo
     * @return boolean
     */
    public static boolean exist(String codigo){
        try{
            Materia.getMateriaByCodmateria(codigo);
            return true;
        } 
        catch (MateriaNotFound ex){
            return false; 
        }
    }//Fin del metodo exist()
    
    public static boolean validar(String codmateria, String nombre, String dnid)throws MateriaNotFound {
        try {
            Materia m = getMateriaByCodmateria(codmateria);

            if ((codmateria.equals(m.getCodmateria())) && (nombre.equals(m.getNombre())) && (dnid.equals(m.getDni()))) {
                return true;
            }
        } catch (MateriaNotFound ex) {
            return false;
        }

        return false;
    }//Fin del método validar(String, String, String)
    
    
    /**
     * Esta clase obtiene un estado, lo modifica con los nombres de las
     * columnas de una tabla de la base de datos y lo agrega.
     * @return boolean
     */
    public boolean save() {
        try {
            Materia.getMateriaByCodmateria(codmateria);
            return false;
        } catch (MateriaNotFound e1) {
            String[] columns = { "codMateria", "nombre", "DNI_responsable" };
            PreparedStatement stm = jpa.newRecord("educar_dev.materia", columns);
            try {
                stm.setString(1, codmateria);
                stm.setString(2, nombre);
                stm.setString(3, dni);
            }catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
            jpa.create(stm);
            return true;
        }
    }//Fin del método save()

        
    /**
     * Elimina una materia por su codigo
     */
    public void destroy() {
	jpa.destroy("materia", "codMateria", this.getCodmateria());
    } 
    
    
    public static void destroyMateriaBycodMateria(String codMateria) {
        jpa.destroy("materia", "codMateria", codMateria);
    }
    

    /**
     * Este metodo retorna una materia, la misma se obtiene buscandola por su codigo.
     * @param codmateria
     * @return
     * @throws MateriaNotFound 
     */
    public static Materia getMateriaByCodmateria(String codmateria) throws MateriaNotFound {
	ResultSet rs = null;
	Materia m = null;
	rs = jpa.getByField("materia", "codMateria", codmateria);
	try {
            if (rs.next()) {
            m = new Materia(rs.getString(2), rs.getString(3), rs.getString(4));
            } else {
                throw new MateriaNotFound();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
	return m;
    }//Fin del método Materia getMateriaByCodmateria(String)
        
    
    /**
     * Este metodo nos permite modificar los valores de cada uno de los atributos
     * de la tabla materia
     * @param oldcodmateria
     * @return 
     */
    public boolean setMateriaByCodmateria(String oldcodmateria) {
        jpa.update("materia", "DNI_responsable", dni, "codMateria",oldcodmateria); 
        jpa.update("materia", "nombre", nombre, "codMateria",oldcodmateria);
        jpa.update("materia", "codMateria", codmateria, "codMateria",oldcodmateria);             
	return true;
    }//Fin del método setMateriaByCodmateria(String)
    
    
    /**
     * Codigo de una materia
     * @return codMateria
     */
    public String getCodmateria() {
        return codmateria;
    }

    /**
     * Asigna un codigo a una materia
     * @param codmateria 
     */
    public void setCodmateria(String codmateria) {
        this.codmateria = codmateria;
    }

    
    /**
     * El dni de un docente responsable de una materia
     * @return dni
     */
    public String getDni() {
        return dni;
    }

    
    /**
     * Asigna un dni a un docente responsable de una materia
     * @param dni 
     */
    public void setDni(String dni) {
        this.dni = dni;
    }

    /**
     * El nombre de una materia
     * @return nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Asigna un nombre a una materia
     * @param nombre 
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
          
}//Fin de la clase Materia.